package ru.niir.goodfil.utils.filters;

import org.apache.commons.lang.StringUtils;

import java.io.Serializable;
import java.sql.Date;
import java.util.Calendar;

/**
 * Класс для фильтрации заказов
 *
 * @see ru.niir.goodfil.db.Order
 */
public class OrdersFilter implements Serializable {
    /**
     * Идентификатор заказа
     */
    private Long orderId;

    /**
     * Идентификатор клиента
     */
    private long clientId = -1;

    /**
     * Идентификатор менеджера
     */
    private long managerId = -1;

    /**
     * Статус заказа
     */
    private int orderStateId = -1;

    /**
     * Тип доставки
     */
    private int deliveryTypeId = -1;

    /**
     * Дата начала. Дата начала периода, внутри которого ищутся заказы с подходящей датой создания
     */
    private Date begDate;

    /**
     * Дата окончания. Дата окончания периода, внутри которого ищутся заказы с подходящей датой создания
     */
    private Date endDate;

    /**
     * Дата начала. Для выборки заказов по дате отгрузки
     */
    private java.util.Date delBeginDate;

    /**
     * Дата окончания. Для выборки заказов по дате отгрузки
     */
    private java.util.Date delEndDate;

    /**
     * Номер заказа в 1С. Поиск по подстроке
     */
    private String c1Num;

    /**
     * Номер накладной. Поиск по подстроке
     */
    private String noteNum;

    /**
     * Возвращает true, если критерии поиска не заданы
     */
    public boolean getIsEmpty() {
        return clientId == -1 &&
                managerId == -1 &&
                orderStateId == -1 &&
                deliveryTypeId == -1 &&
                begDate == null &&
                endDate == null &&
                StringUtils.isBlank(c1Num) &&
                StringUtils.isBlank(noteNum) &&
                orderId == null;
    }

    /**
     * Идентификатор клиента
     */
    public long getClientId() {
        return clientId;
    }

    /**
     * Идентификатор клиента
     */
    public void setClientId(long clientId) {
        this.clientId = clientId;
    }

    /**
     * Идентификатор менеджера
     */
    public long getManagerId() {
        return managerId;
    }

    /**
     * Идентификатор менеджера
     */
    public void setManagerId(long managerId) {
        if (!managerId_isLocked) this.managerId = managerId;
    }

    /**
     * Статус заказа
     */
    public int getOrderStateId() {
        return orderStateId;
    }

    /**
     * Статус заказа
     */
    public void setOrderStateId(int orderStateId) {
        this.orderStateId = orderStateId;
    }

    /**
     * Тип доставки
     */
    public int getDeliveryTypeId() {
        return deliveryTypeId;
    }

    /**
     * Тип доставки
     */
    public void setDeliveryTypeId(int deliveryTypeId) {
        this.deliveryTypeId = deliveryTypeId;
    }

    /**
     * Дата начала. Дата начала периода, внутри которого ищутся заказы с подходящей датой создания
     */
    public Date getBegDate() {
        return begDate;
    }

    public java.util.Date getBegDateAsJavaUtil() {
        if (begDate == null) {
            return null;
        } else {
            return new java.util.Date(begDate.getTime());
        }
    }

    /**
     * Дата начала. Дата начала периода, внутри которого ищутся заказы с подходящей датой создания
     */
    public void setBegDate(Date begDate) {
        if (begDate != null) {
            this.begDate = begDate;
        } else {
            this.begDate = null;
        }
    }

    public void setBegDateAsJavaUtil(java.util.Date begDate) {
        if (begDate != null) {
            this.begDate = new Date(begDate.getTime());
        } else {
            this.begDate = null;
        }
    }

    /**
     * Дата начала. Дата начала периода, внутри которого ищутся заказы с подходящей датой создания
     */
    public void setBegDate(Calendar c) {
        if (c != null) {
            this.begDate = new Date(c.getTimeInMillis());
        } else {
            this.begDate = null;
        }
    }

    /**
     * Дата окончания. Дата окончания периода, внутри которого ищутся заказы с подходящей датой создания
     */
    public Date getEndDate() {
        return endDate;
    }

    public java.util.Date getEndDateAsJavaUtil() {
        if (endDate == null) {
            return null;
        } else {
            return new java.util.Date(endDate.getTime());
        }
    }

    /**
     * Дата окончания. Дата окончания периода, внутри которого ищутся заказы с подходящей датой создания
     */
    public void setEndDate(Date endDate) {
        if (endDate != null) {
            endDate.setHours(23);
            endDate.setMinutes(59);
            endDate.setSeconds(59);
            this.endDate = endDate;
        } else {
            this.endDate = null;
        }
    }

    public void setEndDateAsJavaUtil(java.util.Date endDate) {
        if (endDate != null) {
            endDate.setHours(23);
            endDate.setMinutes(59);
            endDate.setSeconds(59);
            this.endDate = new Date(endDate.getTime());
        } else {
            this.endDate = null;
        }
    }

    /**
     * Дата окончания. Дата окончания периода, внутри которого ищутся заказы с подходящей датой создания
     */
    public void setEndDate(Calendar c) {
        if (c != null) {
            c.set(Calendar.HOUR_OF_DAY, 23);
            c.set(Calendar.MINUTE, 59);
            c.set(Calendar.SECOND, 59);
            c.set(Calendar.MILLISECOND, 0);
            this.endDate = new Date(c.getTimeInMillis());
        } else {
            this.endDate = null;
        }
    }

    public java.util.Date getDelBeginDate() {
        return delBeginDate;
    }

    public void setDelBeginDate(java.util.Date delBeginDate) {
        this.delBeginDate = delBeginDate;
    }

    public java.util.Date getDelEndDate() {
        return delEndDate;
    }

    public void setDelEndDate(java.util.Date delEndDate) {
        this.delEndDate = delEndDate;
    }

    /**
     * Номер заказа в 1С. Поиск по подстроке
     */
    public String getC1Num() {
        return c1Num;
    }

    /**
     * Номер заказа в 1С. Поиск по подстроке
     */
    public void setC1Num(String c1Num) {
        this.c1Num = c1Num;
    }

    /**
     * Номер накладной. Поиск по подстроке
     */
    public String getNoteNum() {
        return noteNum;
    }

    public Long getOrderId() {
        return orderId;
    }

    public void setOrderId(Long orderId) {
        this.orderId = orderId;
    }

    /**
     * Номер накладной. Поиск по подстроке
     */
    public void setNoteNum(String noteNum) {
        this.noteNum = noteNum;
    }

    @Override
    public String toString() {
        return "OrdersFilter{" +
                "orderId='" + orderId + '\'' +
                ", clientId=" + clientId +
                ", managerId=" + managerId +
                ", orderStateId=" + orderStateId +
                ", deliveryTypeId=" + deliveryTypeId +
                ", begDate=" + begDate +
                ", endDate=" + endDate +
                ", c1Num='" + c1Num + '\'' +
                ", noteNum='" + noteNum + '\'' +
                ", managerId_isLocked=" + managerId_isLocked +
                '}';
    }

    private boolean managerId_isLocked = false;

    public void lockManagerId(long managerId) {
        this.managerId = managerId;
        this.managerId_isLocked = true;
    }

    public void unlockManagerId() {
        this.managerId = -1;
        this.managerId_isLocked = false;
    }

    public static OrdersFilter byDateInterval(Calendar begDate, Calendar endDate) {
        OrdersFilter ordersFilter = new OrdersFilter();
        ordersFilter.setBegDate(begDate);
        ordersFilter.setEndDate(endDate);

        return ordersFilter;
    }

    public static OrdersFilter byDelDateInterval(java.util.Date delBegDate, java.util.Date delEndDate) {
        OrdersFilter ordersFilter = new OrdersFilter();
        ordersFilter.setDelBeginDate(delBegDate);
        ordersFilter.setDelEndDate(delEndDate);

        return ordersFilter;
    }

    public static OrdersFilter byLastDays(int daysCount) {
        Calendar begDate = Calendar.getInstance();
        Calendar endDate = Calendar.getInstance();

        begDate.set(Calendar.HOUR_OF_DAY, 0);
        begDate.set(Calendar.MINUTE, 0);
        begDate.set(Calendar.SECOND, 0);

        endDate.set(Calendar.HOUR_OF_DAY, 23);
        endDate.set(Calendar.MINUTE, 59);
        endDate.set(Calendar.SECOND, 59);

        begDate.add(Calendar.DATE, 0 - daysCount);

        return byDateInterval(begDate, endDate);
    }
}
